package com.tenbit.bns.ctl;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import javax.servlet.http.HttpServletRequest;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

import com.tenbit.bns.svc.BNS1000SVCImpl;
import com.tenbit.com.vo.ErrorMsgVO;
import com.tenbit.emp.dao.EmployeeQEMP1000DAO;
import com.tenbit.emp.svc.EMP1000SVC;
import com.tenbit.emp.vo.EMP1000VO;


/**
 * 보너스 대상자를 저장할 때 처리하기 위한 CTL<br>
 * <PRE>
 * SystemName: 텐비트 3주차 workshop
 * BusinessName: 보너스(BNS)
 * Author: 강현구
 * Class Name(en): BNS1000CTL.java
 * Class Name(kor): 보너스 저장 CTL
 * Descripttion: 보너스 대상자를 저장할 때 처리하기 위한 CTL
 * Modification history
 * 수정일      		수정자     		수정내용
 * -------  	---------	------------
 * 2014.04.15	강현구	      최초 생성   
 * </PRE>
 *
 */
@Controller
public class BNS1000CTL {
	
	private Logger log = Logger.getLogger(this.getClass());
	
	@Autowired
	EmployeeQEMP1000DAO employeeQEMP1000DAO;
	@Autowired
	EMP1000SVC emp1000svc;
	@Autowired
	BNS1000SVCImpl bns1000svcImpl;
	
	/**
	* Map<String, String[]>를 Map<String, Object>형태로 변환해준다.
	* @param paraMap - Map<String, String[]>타입
	* @return  Map<String, Object>타입으로 리턴
	*/
    public Map<String, Object> parsingParaMap(Map<String, String[]> paraMap){
        Iterator<Entry<String, String[]>> it=paraMap.entrySet().iterator();
        Map<String, Object> map = new HashMap<String, Object>();
        
         while(it.hasNext()){
             Entry<String, String[]> entry = it.next();
             
              if(entry.getValue(). length > 1){	    //tag의 name값이 여러 개 인 경우
                  List<String> list= new ArrayList<String>();
                  
                   for (String str : entry.getValue()) {
                        list.add(str);
                  }
                  
                  map.put(entry.getKey(), list);
             } else{								//tag의 name값이 하나 인경우
                  map.put(entry.getKey(), entry.getValue()[0]);
                  
             }               
        }
        
         return map;
  }

    /**
	* DB에서 코드집을 읽어와 map으로 화면에 돌려준다.
	* @param 
	* @return  코드집 
	* @throws 
	*/
	public Map<String,Object> doInitMain(){
		
		Map<String, Object> map = new HashMap<String, Object>();
		
		List<EMP1000VO> dept_code=new ArrayList<EMP1000VO>();
		List<EMP1000VO> bonus_code= new ArrayList<EMP1000VO>();
				
		for (EMP1000VO zip : emp1000svc.getCodeZipByMvList()) {
			if(zip.getCode_type().equals("DEPT")){
				dept_code.add(zip);
			}else if(zip.getCode_type().equals("BONUS")){
				bonus_code.add(zip);
			}
		}
		
		map.put("deptCode", dept_code);
		map.put("bonusCode", bonus_code);
		
		return map;
	}
	
	/**
	* 보너스 화면에서 왼쪽에 있는 grid화면을 보여준다.
	* @param deptCode - 검색 시 부서명 조건
	* @return 검색 결과
	* @throws 
	*/
	@RequestMapping("/getBNS.do")
	@ResponseBody
	public Map<String, Object> getBNS(@RequestParam(value="deptCode",required=false,defaultValue="D1") String deptCode){
		
		log.debug("=======start: "+this.getClass().getName()+"."+new Exception().getStackTrace()[0].getMethodName()
				+"=======");

		Map<String, Object> map = new HashMap<String, Object>();
		
		map.put("page", "1");
		map.put("total", "3");
		map.put("records", "30");
		
		Map<String, Object> paraMap = new HashMap<String, Object>();
		
		paraMap.put("deptCode", deptCode);
		map.put("rows", emp1000svc.getDeptNamelist(paraMap));
		
		log.debug("=======end: "+this.getClass().getName()+"."+new Exception().getStackTrace()[0].getMethodName()
				+"=======");
				
		return map;
	}
	
	/**
	* 보너스 화면에서 오른쪽에 있는 grid화면을 보여준다.
	* @param request - 검색 시 필요한 request
	* @return 검색 결과
	* @throws 
	*/
	@RequestMapping("/getBNS2.do")
	@ResponseBody
	public Map<String, Object> getBNS2(HttpServletRequest request){
		
		log.debug("=======start: "+this.getClass().getName()+"."+new Exception().getStackTrace()[0].getMethodName()
				+"=======");
		
		Map<String, Object> map = new HashMap<String, Object>();
		
		map.put("page", "1");
		map.put("total", "3");
		map.put("records", "30");
		
		Map<String, Object> paraMap = parsingParaMap(request.getParameterMap());
		
		//최초 실행 시 폼필드가 없으므로 bonusCode가 null값이 된다.
		if(paraMap.get("bonusCode") == null	){
			Calendar now = Calendar.getInstance();
			
			String sysDate = ""+now.get(Calendar.YEAR)
					+( (now.get(Calendar.MONTH)+1)<10 ? "0"+(now.get(Calendar.MONTH)+1) : now.get(Calendar.MONTH)+1 )
					+( now.get(Calendar.DATE)<10 ? "0"+now.get(Calendar.DATE) : now.get(Calendar.DATE) );
			
			paraMap.put("bonusCode", "B1");
			paraMap.put("deptCode", "D1");
			paraMap.put("paymentSDate",sysDate);
			paraMap.put("paymentEDate",sysDate);
		}
		
		List<Map<String, Object>> rowsMap = bns1000svcImpl.listBonus(paraMap);
		
		map.put("rows",rowsMap );
		
		//검색 폼 저장
		map.put("searchForm", paraMap);
		
		log.debug("=======end: "+this.getClass().getName()+"."+new Exception().getStackTrace()[0].getMethodName()
				+"=======");
		
		return map;
	}
	
	/**
	* 보너스 화면에서 저장 버튼을 눌렀을 때 데이터들의 입력,수정,삭제를 실행한다. 
	* @param dataSet - 입력,수정,삭제를 위한 데이터
	* @return 검증 실패 시 에러메세지
	* @throws 
	*/
	@RequestMapping("/doSaveBNS.do")
	@ResponseBody
	public String doSaveBNS(@RequestBody List<Map<String, Object>> dataSet){
		
		log.debug("=======start: "+this.getClass().getName()+"."+new Exception().getStackTrace()[0].getMethodName()
				+"=======");
		
		ModelAndView mv = new ModelAndView();
		
		ErrorMsgVO errMsg = bns1000svcImpl.doValidateForm(dataSet);
		
		if(errMsg.isErrExist()){
			return errMsg.getErrMsg();
		}
		
		bns1000svcImpl.exeBonus(dataSet);
			
		
		log.debug("=======end: "+this.getClass().getName()+"."+new Exception().getStackTrace()[0].getMethodName()
				+"=======");
		
		return "";
	}
	
	/**
	* 보너스 화면 최초 실행 시 보여주는 화면 
	* @param 
	* @return 최초 실행시의 화면
	* @throws 
	*/
	@RequestMapping("/doBNSMainView.do")
	ModelAndView doBNSMainView(){
		
		ModelAndView mv = new ModelAndView();
		
		Calendar now = Calendar.getInstance();
		
		String sysDate = ""+now.get(Calendar.YEAR)
				+( (now.get(Calendar.MONTH)+1)<10 ? "0"+(now.get(Calendar.MONTH)+1) : now.get(Calendar.MONTH)+1 )
				+( now.get(Calendar.DATE)<10 ? "0"+now.get(Calendar.DATE) : now.get(Calendar.DATE) );
		
		mv.addObject("codeZip",doInitMain());
		mv.setViewName("BNS1000M0");
		
		//최초 실행 시 default값을 시스템 일자로 설정한다.
		mv.addObject("paymentSDate",sysDate);
		mv.addObject("paymentEDate",sysDate);
		
		return mv;
	}
	

}
